﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Processing.Structures
{
    /// <summary>
    /// Modelliert einen OpenCL Float16
    /// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct Float16
    {
        #region Attribute
        /// <summary>
        /// Gibt und setzt den Wert von s0.
        /// </summary>
        public float s0;

        /// <summary>
        /// Gibt und setzt den Wert von s1.
        /// </summary>
        public float s1;

        /// <summary>
        /// Gibt und setzt den Wert von s2.
        /// </summary>
        public float s2;

        /// <summary>
        /// Gibt und setzt den Wert von s3.
        /// </summary>
        public float s3;

        /// <summary>
        /// Gibt und setzt den Wert von s4.
        /// </summary>
        public float s4;

        /// <summary>
        /// Gibt und setzt den Wert von s5.
        /// </summary>
        public float s5;

        /// <summary>
        /// Gibt und setzt den Wert von s6.
        /// </summary>
        public float s6;

        /// <summary>
        /// Gibt und setzt den Wert von s7.
        /// </summary>
        public float s7;

        /// <summary>
        /// Gibt und setzt den Wert von s8.
        /// </summary>
        public float s8;

        /// <summary>
        /// Gibt und setzt den Wert von s9.
        /// </summary>
        public float s9;

        /// <summary>
        /// Gibt und setzt den Wert von sa.
        /// </summary>
        public float sa;

        /// <summary>
        /// Gibt und setzt den Wert von sb.
        /// </summary>
        public float sb;

        /// <summary>
        /// Gibt und setzt den Wert von sc.
        /// </summary>
        public float sc;

        /// <summary>
        /// Gibt und setzt den Wert von sd.
        /// </summary>
        public float sd;

        /// <summary>
        /// Gibt und setzt den Wert von se.
        /// </summary>
        public float se;

        /// <summary>
        /// Gibt und setzt den Wert von sf.
        /// </summary>
        public float sf;
        #endregion Attribute

        #region Methoden
        /// <summary>
        /// Initialisiert die Struktur mit Werten.
        /// </summary>
        /// <param name="s0">Der Wert für s0.</param>
        /// <param name="s1">Der Wert für s1.</param>
        /// <param name="s2">Der Wert für s2.</param>
        /// <param name="s3">Der Wert für s3.</param>
        /// <param name="s4">Der Wert für s4.</param>
        /// <param name="s5">Der Wert für s5.</param>
        /// <param name="s6">Der Wert für s6.</param>
        /// <param name="s7">Der Wert für s7.</param>
        /// <param name="s8">Der Wert für s8.</param>
        /// <param name="s9">Der Wert für s9.</param>
        /// <param name="sa">Der Wert für sa.</param>
        /// <param name="sb">Der Wert für sb.</param>
        /// <param name="sc">Der Wert für sc.</param>
        /// <param name="sd">Der Wert für sd.</param>
        /// <param name="se">Der Wert für se.</param>
        /// <param name="sf">Der Wert für sf.</param>
        public Float16(float s0, float s1, float s2, float s3, float s4, float s5, float s6, float s7,
                       float s8, float s9, float sa, float sb, float sc, float sd, float se, float sf)
        {
            this.s0 = s0;
            this.s1 = s1;
            this.s2 = s2;
            this.s3 = s3;
            this.s4 = s4;
            this.s5 = s5;
            this.s6 = s6;
            this.s7 = s7;
            this.s8 = s8;
            this.s9 = s9;
            this.sa = sa;
            this.sb = sb;
            this.sc = sc;
            this.sd = sd;
            this.se = se;
            this.sf = sf;
        }

        /// <summary>
        /// Gibt eine Zeichenkettenrepräsentation der Struktur zurück.
        /// </summary>
        /// <returns>Die Zeichenkette.</returns>
        public override string ToString()
        {
            return "s0: " + s0.ToString() + 
                   " s1: " + s1.ToString() +
                   " s2: " + s2.ToString() +
                   " s3: " + s3.ToString() +
                   " s4: " + s4.ToString() +
                   " s5: " + s5.ToString() +
                   " s6: " + s6.ToString() +
                   " s7: " + s7.ToString() +
                   " s8: " + s8.ToString() +
                   " s9: " + s9.ToString() +
                   " sa: " + sa.ToString() +
                   " sb: " + sb.ToString() +
                   " sc: " + sc.ToString() +
                   " sd: " + sd.ToString() +
                   " se: " + se.ToString() +
                   " sf: " + sf.ToString();
        }
        #endregion Methoden
    }
}
